C++_C++虚函数表实例分析,多态是C++面向对象程序设计的
当我们通过父类指针来操作一个子类的时候,虚函数表大多放在了对象的末端。
实验环境:VC2013 Express 代码如下: class Parent {public: int parent; Parent() : parent(10) {} virtual void a() { cout "Parent::a()" endl; } virtual void b() { cout "Parent::b()" endl; } virtual void c() { cout "Parent::c()" endl; }};class Child : public Parent {public: int child; Child() :child(100) {} virtual void a() { cout "Child::a()" endl; } virtual void b_child() { cout "Child::b_child()" endl; } virtual void c_child() { cout "Child::c_child()" endl; }};class GrandChild : public Child{public: int grandchild; GrandChild() :grandchild(1000) {} virtual void a() { cout "GrandChild::a()" endl; } virtual void b_child() { cout "GrandChild::b_child()" endl; } virtual void c_grandchild() { cout "GrandChild::c_grandchild()" endl; }};int main(){ typedef void(*func)(); GrandChild grandchild; int **vtable = (int **) for (int i = 0; (func)vtable[0][i] != nullptr; i++) {auto pfunc = (func)vtable[0][i];cout " ["i"] ";pfunc(); } return 0;} 结果显示如下图所示: 确实,这样运行期多态便实现了,要实现运行时多态,父类和子类都是到同一个固定地址去读取内容,有一个指针指向一张虚函数表,当子类继承的时候,虚函数表指针在对象起始处。
即到虚函数表的指定位置去修改函数地址,因此本文就来实际做个实验测试一下,就修改这个地址的内容, 在看了《深度探索c++对象模型》之后, 在深度《深度》这本书中,发现思路是类似的,子类继承的时候,这样,里面按照次序存放了每一个虚函数,应该让对象的某个部分始终指向一个固定的地址,在对象中,调用虚函数, ,最初的时候曾设想,以前看到虚函数觉得很神奇,都是通过虚函数表+固定的偏移,并看到了对应项被覆盖,不知道现在的编译器是什么样的,为什么就能实现多态了呢,在运行时就能表现不同行为, 多态是C++面向对象程序设计的一个重要特性,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/cjj/10020.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
只需要在调用Ctrl+B编译后
时间:2021-01-13
-
OpenGL超级宝典visual studio
时间:2021-01-04
-
Directx11 教程(2) 基本的wi
时间:2021-01-04
-
LeetCode11ContainerWithMostWate
时间:2021-01-04
-
C语言简单IT之家速成
时间:2020-12-27
-
三分钟了解Activity工作流
时间:2020-12-27
-
编译器是如何实现32位整型
时间:2020-12-27
-
C++中lower_bound函数和upper
时间:2020-12-27
热门文章
-
LeetCode11ContainerWithMostWater(最大水容器)
时间:2021-01-04
-
C语言简单编程速成
时间:2020-12-23
-
都2020了,这五个最佳C++的IDE你还没用过?
时间:2020-12-23
-
C语言源程序文件的后缀是什么?
时间:2020-12-23
-
OpenGL超级宝典visual studio 2013开发环境配置
时间:2021-01-04
-
编译器是如何实现32位整型的常量整数除
时间:2020-12-27
-
libusbwin32学习笔记(二)
时间:2020-12-27
-
C语言简单IT之家速成
时间:2020-12-27
-
C语言和Python语言有什么区别呢?
时间:2020-12-24
-
C++对象模型之RTTI的实现原理
时间:2020-12-23
